class Solution {
public:
    //这道题最主要就是找到left位置前一个节点，和right位置后一个节点，然后对[left,right]位置进行翻转，将然后就是四个节点间的连接了。
    ListNode* reverseBetween(ListNode* head, int left, int right) {
        if(left == right)
        return head;
        ListNode* new_head = new ListNode(0,head);
        ListNode* prev = new_head; //prev是位置left的前一个结点
        ListNode* cur = head;
        ListNode* back = cur->next; //back是位置right的后一个结点
        int pos = 1;
        while(pos < left)
        {
            prev = cur;
            cur = cur->next;
            if(back) //back有可能本身就是空指针
            back = back->next;
            ++pos;
        }
        //进行翻转
        ListNode* re_prev = nullptr; //表示翻转后部分链表的头节点
        ListNode* re_back = cur; //表示翻转后的部分链表的尾节点
        ListNode* re_head = nullptr;//翻转部分链表的辅助节点
        ListNode* tmp = nullptr;//翻转链表的辅助节点
        while(pos < right+1)
        {
            tmp = cur->next;
            cur->next = re_head;
            re_head = cur;
            cur = tmp;
            ++pos;
        }
        back = cur;
        re_prev = re_head;
        prev->next = re_prev;
        re_back->next = back;
        head = new_head->next; //不能直接返回head，如果head是left位置，此时直接返回head就是错误的
        delete new_head;
        return head;
    }
};